AWSアカウント作成時のイベントと各種自動化の順序を調べてみる【AWS Control Tower, AWS Organizations】
AWS Organizations や AWS Control Tower を活用することで、 「AWSアカウント作成時に自動でXXXを設定する」といった処理を実装できます。 例えば以下のような処理です。
- Organizations連携の活用
- AWS Security Hubを自動有効化
- AWS GuardDutyを自動有効化
- CloudFormationテンプレートを自動展開 (等)
- Account Factory Customization を使ってService Catalog製品を自動展開
- 『新規アカウント作成時に発行されるイベント』をEventBridgeで拾って、何か処理を実行 (等)
色んな方法で自動化できますが、 それらイベントがどのような順序で実施されるのか が気になりました。 ドキュメントを探れば見つかるかも知れませんが、 今回は実際にAWSアカウントを作成してみて、試してみます。
試したこと
今回は AWS Control Tower の Account Factory から新規アカウントを生成します。
その際に以下自動化が走るように設定しました。
- Account Factory Customization(AFC) によるリソース展開 ( by AWS Control Tower )
- AWS Security Hub の自動有効化・メンバー化 ( by AWS Organizations連携 )
- Amazon GuardDuty の自動有効化・メンバー化 ( by AWS Organizations連携 )
- AWS CloudFormation StackSetsによるリソース展開 ( by AWS Organizations連携 )
AWSアカウント作成後にCloudTrailを確認して、各種イベントの内容や時刻を調べました。 また、EventBridge ルールにて、AWS Control Tower および AWS Organizations のイベントを取得する以下のようなフィルターをバージニア北部・東京リージョンに作成しています。
{ "source": [ "aws.controltower", "aws.organizations" ], "detail-type": ["AWS Service Event via CloudTrail"] }
※ AFCとCFn StackSetsで展開するリソースは 3分間待機する Lambda-backedカスタムリソース
を使いました
結果
某日 16:00:00 に Account Factory から [アカウントの作成] を選択しました。 そこから発生した主要な自動化イベントのタイムラインは以下のとおりです。
詳細を以下テキストに記載します。
- 16:00:05 CreateManagedAccountリクエスト送信 (CloudTrailから確認)
- 16:00:19 EventBridgeのCreateAccountResultイベント発生 (CloudWatch Logsで確認)
- 16:00:19 AWS Security Hub にて新規アカウントが自動メンバー登録 (GetMember APIで確認)
- 16:00:19 AWS GuardDuty にて新規アカウントが自動メンバー登録 (GetMember APIで確認)
- 16:01:52 MoveAccountリクエスト送信 (CloudTrailから確認)
- 16:02:19 CFn StackSet OU自動展開によるCREATEオペレーション開始 (CFnコンソールにて確認)
- 16:06:17 CFn StackSet OU自動展開によるCREATEオペレーション完了 (CFnコンソールにて確認)
- 16:17:01 AFCによるService Catalog製品 展開開始 (CFnコンソールにて確認)
- 16:20:59 AFCによるService Catalog製品 展開完了 (CFnコンソールにて確認)
- 16:21:25 EventBridgeのCreateManagedAccountイベント発生 (CloudWatch Logsで確認)
(注) Account Factory でAWSアカウントを作成完了するまでの時間は参考にはなりません。設定しているコントロール(ガードレール)の量や、AFCで展開するリソースに依存します
順序の考察
CreateManagedAccountリクエスト → CreateAccountResultイベント
Account Factory からのアカウント作成は controltower:CreateManagedAccount
イベントとして CloudTrailログ上で確認されました。
そこからおおよそ15秒後には 以下のようなEventBridgeイベントが発行されました。 ※ us-east-1 リージョンである点に注意。
{ "version": "0", "id": "e729ffa7-6fd5-1266-db1c-example", "detail-type": "AWS Service Event via CloudTrail", "source": "aws.organizations", "account": "123456789012", "time": "2023-02-11T07:00:19Z", "region": "us-east-1", "resources": [], "detail": { "eventVersion": "1.08", "userIdentity": { "accountId": "123456789012", "invokedBy": "AWS Internal" }, "eventTime": "2023-02-11T07:00:19Z", "eventSource": "organizations.amazonaws.com", "eventName": "CreateAccountResult", "awsRegion": "us-east-1", ### (略) ### "serviceEventDetails": { "createAccountStatus": { "id": "car-bd47example", "state": "SUCCEEDED", "accountName": "****", "accountId": "111111111111", "requestedTimestamp": "Feb 11, 2023 7:00:17 AM", "completedTimestamp": "Feb 11, 2023 7:00:19 AM" } }, "eventCategory": "Management" } }
このイベント(CreateAccountResult)をトリガーに、通知や各種ベースライン構築の仕組みを作れそうです。
※ ただ AWS Control Tower の場合は後述する CreateManagedAccount イベントを活用したほうが良いでしょう。
AWS Organizations連携(Security Hub/GuardDuty)
新規AWSアカウントは Security Hub および GuardDutyの Organizations連携によって、 自動的にメンバー登録されるように設定していました。
結果としては、「AWS作成完了のイベント(CreateAccountResult)時刻」と 「Security Hub/GuardDutyで自動メンバー登録時刻」が "同じ" となりました。 そのため、「AWS作成完了イベント」と「Security Hub/GuardDuty の自動有効化」の順序関係は分かりませんでした。
また、委任先アカウントや新規アカウントのCloudTrailを見ましたが、 なにか「メンバー登録された or 自動有効化された」といったイベントも見つかりませんでした。
MoveAccountリクエスト → AWS Organizations連携(CFnのOU自動展開)
AWS Control Tower によって新規アカウントが「指定したOU」へ移動される(MoveAccount)ことを、 CloudTrailで確認しました。
「指定したOU」には CFn StackSet の OU自動デプロイを設定しています。 そのため、OUに所属したタイミングで、CFnテンプレートが展開されました。
AFC → CreateManagedAccountイベント
今回、一番確かめたかったところです。 AFCによる製品展開 "完了後" に Control Tower のライフサイクルイベントである CreateManagedAccount
が発行されました。 ※このイベントはControl Tower のホームリージョンで発行されます。
以下のようなイベントとなります。
{ "version": "0", "id": "2186ff53-6a4c-3789-ffb3-7bcexample", "detail-type": "AWS Service Event via CloudTrail", "source": "aws.controltower", "account": "123456789012", "time": "2023-02-11T07:21:25Z", "region": "ap-northeast-1", "resources": [], "detail": { "eventVersion": "1.08", "userIdentity": { "accountId": "123456789012", "invokedBy": "AWS Internal" }, "eventTime": "2023-02-11T07:21:25Z", "eventSource": "controltower.amazonaws.com", "eventName": "CreateManagedAccount", "awsRegion": "ap-northeast-1", ### (略) ### "serviceEventDetails": { "createManagedAccountStatus": { "organizationalUnit": { "organizationalUnitName": "Test", "organizationalUnitId": "ou-xxxx-51example" }, "account": { "accountName": "test-2023-02-11-2", "accountId": "111111111111" }, "state": "SUCCEEDED", "message": "AWS Control Tower successfully created an enrolled account.", "requestedTimestamp": "2023-02-11T07:00:04+0000", "completedTimestamp": "2023-02-11T07:21:25+0000" } }, "eventCategory": "Management" } }
このイベント(CreateManagedAccount)をトリガーに、追加でベースライン構築の仕組みを作れます。
ベースライン構築の前提として「何かリソースを用意しておく必要がある」場合は、AFCを活用すると良さそうだと感じました。
※ そもそもベースライン構築自体、AFC内で完結させることも可能だと思います。 ただ AFC自体は Service Catalog製品(1つのCFnテンプレート)です。 ベースラインの内容が大きくなってくると、管理・更新が煩雑になってきそうです。
おわりに
以上、各種自動化要素の実行タイミングを調べてみました。
「AWSアカウント作成時に何かを実行する」手段は多いです。 どれがどのタイミングで実行されているのか、ざっくりとイメージしたかったので今回の検証を実施しました。
また、新機能 Account Factory Customization(AFC)は、想定通り CreateManagedAccountイベントの前に 実行されるのか。それも確かめられてよかったです。
以上、参考になれば幸いです。